package cn.design.realize;

/**
 * @author dlq
 * @description 编程模板方法
 *      抽象父类模板(Abstract Template):
 *     (1) 定义了一个或多个抽象操作，以便让子类实现。这些抽象操作叫做基本操作，它们是一个顶级逻辑的组成步骤。
 *     (2) 定义并实现了一个模板方法。这个模板方法一般是一个具体方法，它给出了一个顶级逻辑的骨架，而逻辑的组成步骤在相应的抽象操作中，推迟到子类实现。顶级逻辑也有可能调用一些具体方法父类中有一个调用其他方法的总方法
 *     (3) 抽象父类可能会实现其中的一些步骤，但是剩下的步骤通过具体不同的功能交给不同功能的子类实现
 *
 *    code 是一个总方法
 * @date 2020/10/19 9:52
 * @since 1.0
 */
public abstract class ProjectAbstractTemplate {

    /**
     * @description  提供一个总的方法,顶级逻辑
     * @param
     * @return void
     * @author dlq
     * @date 2020/10/19 10:07
     */
    public void coding(){
        //准备电脑
        this.readyComputer();
        //电脑安装 window
        this.readyComputerEnv();
        //安装编码环境
        this.readCodingEnv();
        //安装 编码软件
        this.readCodingSoftware();
        //开始创建工程
        this.startProject();
    }

    /**
     * @description 定义并实现了一个模板方法,组成顶级逻辑,且是共享的逻辑
     * @param
     * @return void
     * @author dlq
     * @date 2020/10/19 10:08
     */
    protected void readyComputer(){
        System.out.println("准备一台 联想电脑......");
    }
    /**
     * @description 定义并实现了一个模板方法,组成顶级逻辑,且是共享的逻辑
     * @param
     * @return void
     * @author dlq
     * @date 2020/10/19 10:08
     */
    protected void readyComputerEnv(){
        System.out.println("给联想安装 window 环境......");
    }
    /**
     * @description 定义并实现了一个模板方法,组成顶级逻辑,由子类去实现
     * @param
     * @return void
     * @author dlq
     * @date 2020/10/19 10:08
     */
    protected abstract void readCodingEnv();

    /**
     * @description 定义并实现了一个模板方法,组成顶级逻辑,由子类去实现
     * @param
     * @return void
     * @author dlq
     * @date 2020/10/19 10:08
     */
    protected abstract void readCodingSoftware();

    /**
     * @description 定义并实现了一个模板方法,组成顶级逻辑,由子类去实现
     * @param
     * @return void
     * @author dlq
     * @date 2020/10/19 10:08
     */
    protected abstract void startProject();




}
